"use strict";

var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = exports.dateFormatterMap = exports.convertMoment = void 0;
exports.isPlainObject = isPlainObject;

var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));

var _moment = _interopRequireDefault(require("moment"));

var _get = _interopRequireDefault(require("rc-util/lib/utils/get"));

var _isNil = _interopRequireDefault(require("../isNil"));

var dateFormatterMap = {
  time: 'HH:mm:ss',
  timeRange: 'HH:mm:ss',
  date: 'YYYY-MM-DD',
  dateWeek: 'YYYY-wo',
  dateMonth: 'YYYY-MM',
  dateQuarter: 'YYYY-\\QQ',
  dateYear: 'YYYY',
  dateRange: 'YYYY-MM-DD',
  dateTime: 'YYYY-MM-DD HH:mm:ss',
  dateTimeRange: 'YYYY-MM-DD HH:mm:ss'
};
exports.dateFormatterMap = dateFormatterMap;

function isObject(o) {
  return Object.prototype.toString.call(o) === '[object Object]';
}

function isPlainObject(o) {
  if (isObject(o) === false) return false; // If has modified constructor

  var ctor = o.constructor;
  if (ctor === undefined) return true; // If has modified prototype

  var prot = ctor.prototype;
  if (isObject(prot) === false) return false; // If constructor does not have an Object-specific method

  if (prot.hasOwnProperty('isPrototypeOf') === false) {
    return false;
  } // Most likely a plain Object


  return true;
}
/**
 * 根据不同的格式转化 moment
 *
 * @param value
 * @param dateFormatter
 * @param valueType
 */


var convertMoment = function convertMoment(value, dateFormatter, valueType) {
  if (!dateFormatter) {
    return value;
  }

  if (_moment.default.isMoment(value)) {
    if (dateFormatter === 'number') {
      return value.valueOf();
    }

    if (dateFormatter === 'string') {
      return value.format(dateFormatterMap[valueType] || 'YYYY-MM-DD HH:mm:ss');
    }

    if (typeof dateFormatter === 'string' && dateFormatter !== 'string') {
      return value.format(dateFormatter);
    }

    if (typeof dateFormatter === 'function') {
      return dateFormatter(value, valueType);
    }
  }

  return value;
};
/**
 * 这里主要是来转化一下数据 将 moment 转化为 string 将 all 默认删除
 *
 * @param value
 * @param dateFormatter
 * @param proColumnsMap
 */


exports.convertMoment = convertMoment;

var conversionMomentValue = function conversionMomentValue(value, dateFormatter, valueTypeMap, omitNil, parentKey) {
  var tmpValue = {};
  if (typeof window === 'undefined') return value; // 如果 value 是 string | null | Blob类型 其中之一，直接返回
  // 形如 {key: [File, File]} 的表单字段当进行第二次递归时会导致其直接越过 typeof value !== 'object' 这一判断 https://github.com/ant-design/pro-components/issues/2071

  if ((0, _typeof2.default)(value) !== 'object' || (0, _isNil.default)(value) || value instanceof Blob || Array.isArray(value)) {
    return value;
  }

  Object.keys(value).forEach(function (key) {
    var namePath = parentKey ? [parentKey, key].flat(1) : [key];
    var valueFormatMap = (0, _get.default)(valueTypeMap, namePath) || 'text';
    var valueType = 'text';
    var dateFormat;

    if (typeof valueFormatMap === 'string') {
      valueType = valueFormatMap;
    } else if (valueFormatMap) {
      valueType = valueFormatMap.valueType;
      dateFormat = valueFormatMap.dateFormat;
    }

    var itemValue = value[key];

    if ((0, _isNil.default)(itemValue) && omitNil) {
      return;
    } // 处理嵌套的情况


    if (isPlainObject(itemValue) && // 不是数组
    !Array.isArray(itemValue) && // 不是 moment
    !_moment.default.isMoment(itemValue)) {
      tmpValue[key] = conversionMomentValue(itemValue, dateFormatter, valueTypeMap, omitNil, [key]);
      return;
    } // 处理 FormList 的 value


    if (Array.isArray(itemValue)) {
      tmpValue[key] = itemValue.map(function (arrayValue, index) {
        if (_moment.default.isMoment(arrayValue)) {
          return convertMoment(arrayValue, dateFormat || dateFormatter, valueType);
        }

        return conversionMomentValue(arrayValue, dateFormatter, valueTypeMap, omitNil, [key, "".concat(index)]);
      });
      return;
    }

    tmpValue[key] = convertMoment(itemValue, dateFormat || dateFormatter, valueType);
  });
  return tmpValue;
};

var _default = conversionMomentValue;
exports.default = _default;